home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / drivers.arc / MHDR.ASM < prev    next >
Assembly Source File  |  1985-07-02  |  6KB  |  242 lines

  1.     PAGE    60, 132
  2. TITLE    HDR    22-Feb-85    Device Driver Header            |
  3.  
  4. ;-----------------------------------------------------------------------|
  5. ;                                    |
  6. ;    Device Driver Library                        |
  7. ;        Device Driver Header                    |
  8. ;                                    |
  9. ;-----------------------------------------------------------------------|
  10. ;    REVISION HISTORY                        |
  11. ;                                    |
  12. ; Number    DD-MMM-YY          WHO            WHY        |
  13. ;-------|---------------|-----------------------|-----------------------|
  14. ; 0.0    |   22-Feb-85    | Frank Whaley        | Initial Release    |
  15. ;-----------------------------------------------------------------------|
  16.  
  17.     PAGE
  18. ;-----------------------------------------------------------------------|
  19. ;    Equates                                |
  20. ;-----------------------------------------------------------------------|
  21.  
  22. StkSiz    EQU    256            ; local stack size
  23.  
  24.     PAGE
  25. ;-----------------------------------------------------------------------|
  26. ;    Group Selection                            |
  27. ;-----------------------------------------------------------------------|
  28.  
  29. PGROUP    Group    PROG, TAIL
  30. DGROUP    Group    DATA, DTAIL
  31.  
  32. PROG    Segment Para Public 'PROG'
  33. PROG    EndS
  34.  
  35. DATA    Segment Para Public 'DATA'    ; define first
  36. DATA    EndS
  37.  
  38.     Assume    CS:PROG, DS:DATA, ES:DATA, SS:DATA
  39.  
  40.     PAGE
  41. ;-----------------------------------------------------------------------|
  42. ;    Program Segment                            |
  43. ;-----------------------------------------------------------------------|
  44.  
  45. PROG    Segment Para Public 'PROG'
  46.  
  47.     Extrn    Init:Near,    MediaChe:Near,    BuildBPB:Near
  48.     Extrn    IoCtlIn:Near,    Input:Near,    ndInput:Near
  49.     Extrn    InputSta:Near,    InputFlu:Near,    Output:Near
  50.     Extrn    OutVerif:Near,    OutStatu:Near,    OutFlush:Near
  51.     Extrn    IoCtlOut:Near,    DevOpen:Near,    DevClose:Near
  52.     Extrn    RemMedia:Near
  53.  
  54.     ORG    0
  55.  
  56. HDR    Proc    Far
  57.  
  58. ;-----------------------------------------------------------------------|
  59. ;    Device Header                            |
  60. ;-----------------------------------------------------------------------|
  61.  
  62.     DD    -1            ; -> next device
  63.     DW    8000H            ; character only device
  64.     DW    Strategy        ; -> device strategy
  65.     DW    Interrupt        ; -> device interrupt
  66.     DB    "MON     "        ; mono
  67.  
  68. ;-----------------------------------------------------------------------|
  69. ;    Code Segment Variables                        |
  70. ;-----------------------------------------------------------------------|
  71.  
  72. RHptr    DD    (?)            ; -> Request Header
  73. ssEntry    DW    (?)            ; entry SS
  74. spEntry    DW    (?)            ; entry SP
  75.  
  76.     PAGE
  77. ;-----------------------------------------------------------------------|
  78. ;    Device Strategy                            |
  79. ;                                    |
  80. ;    ENTRY :    ES:BX -> Request Header                    |
  81. ;                                    |
  82. ;    EXIT :    Request Header copied to ReqHdr                |
  83. ;        all registers preserved                    |
  84. ;                                    |
  85. ;-----------------------------------------------------------------------|
  86.  
  87. Strategy:
  88.  
  89.     MOV    Word Ptr CS:RHptr,BX    ; save request header ptr
  90.     MOV    Word Ptr CS:RHptr + 2,ES
  91.  
  92.     PUSHF                ; (+1) save the world
  93.     PUSH    ES            ; (+2)
  94.     PUSH    DS            ; (+3)
  95.     PUSH    SI            ; (+4)
  96.     PUSH    DI            ; (+5)
  97.     PUSH    CX            ; (+6)
  98.     PUSH    BX            ; (+7)
  99.  
  100.     MOV    SI,BX
  101.     MOV    BX,ES
  102.     MOV    DS,BX            ; DS:SI -> Request Header
  103.  
  104.     MOV    BX,Offset PGROUP:TAIL
  105.     MOV    CL,4
  106.     SHR    BX,CL
  107.     MOV    CX,CS
  108.     ADD    BX,CX
  109.     MOV    ES,BX
  110.     MOV    DI,Offset DGROUP:ReqHdr    ; ES:DI -> ReqHdr
  111.  
  112.     CLD
  113.     XOR    CH,CH
  114.     MOV    CL,[SI]
  115.     REP    MOVSB            ; copy Request Header
  116.     
  117.     POP    BX            ; (+6) restore
  118.     POP    CX            ; (+5)
  119.     POP    DI            ; (+4)
  120.     POP    SI            ; (+3)
  121.     POP    DS            ; (+2)
  122.     POP    ES            ; (+1)
  123.     POPF                ; (+0)
  124.     RET
  125.  
  126.     PAGE
  127. ;-----------------------------------------------------------------------|
  128. ;    Device Interrupt                        |
  129. ;                                    |
  130. ;    ENTRY :    anything                        |
  131. ;                                    |
  132. ;    EXIT :    all registers preserved                    |
  133. ;                                    |
  134. ;-----------------------------------------------------------------------|
  135.  
  136. Interrupt:
  137.  
  138.     PUSH    DS            ; (+1) save the world
  139.     PUSH    ES            ; (+2)
  140.     PUSH    AX            ; (+3)
  141.     PUSH    BX            ; (+4)
  142.     PUSH    CX            ; (+5)
  143.     PUSH    DX            ; (+6)
  144.     PUSH    SI            ; (+7)
  145.     PUSH    DI            ; (+8)
  146.     PUSH    BP            ; (+9)
  147.  
  148.     MOV    CS:ssEntry,SS        ; save entry SS
  149.     MOV    CS:spEntry,SP        ; and SP
  150.  
  151.     MOV    AX,Offset PGROUP:TAIL    ; set our DS, SS, BP, and SP
  152.     MOV    CL,4
  153.     SHR    AX,CL
  154.     MOV    CX,CS
  155.     ADD    AX,CX
  156.     MOV    BX,Offset DGROUP:MyStack
  157.     MOV    DS,AX
  158.     MOV    ES,AX
  159.     MOV    SS,AX
  160.     MOV    SP,BX
  161.     MOV    BP,BX
  162.  
  163.     ;
  164.     ; call our function
  165.     ;
  166.     MOV    AL,ReqHdr + 2        ; AL = Command Code
  167.     SHL    AL,1
  168.     CBW
  169.     MOV    SI,Offset DGROUP:FuncTab
  170.     ADD    SI,AX
  171.     CALL    Word Ptr [SI]
  172.  
  173.     ;
  174.     ; copy back Request Header
  175.     ;
  176.     LES    DI,RHptr        ; ES:DI -> original space
  177.     MOV    SI,Offset DGROUP:ReqHdr    ; DS:SI -> our (updated) copy
  178.     CLD
  179.     XOR    CH,CH
  180.     MOV    CL,[SI]
  181.     REP    MOVSB            ; copy Request Header
  182.  
  183.     MOV    SS,CS:ssEntry        ; restore original stuff
  184.     MOV    SP,CS:spEntry
  185.  
  186.     POP    BP            ; (+8) restore
  187.     POP    DI            ; (+7)
  188.     POP    SI            ; (+6)
  189.     POP    DX            ; (+5)
  190.     POP    CX            ; (+4)
  191.     POP    BX            ; (+3)
  192.     POP    AX            ; (+2)
  193.     POP    ES            ; (+1)
  194.     POP    DS            ; (+0)
  195.     RET
  196.  
  197. HDR    EndP
  198.  
  199. PROG    EndS
  200.  
  201. TAIL    Segment Public 'PROG'        ; for finding end of code segment
  202. TAIL    EndS
  203.  
  204.     PAGE
  205. ;-----------------------------------------------------------------------|
  206. ;    Data Segment                            |
  207. ;-----------------------------------------------------------------------|
  208.  
  209. DATA    Segment Para Public 'DATA'
  210.  
  211.     Public    ReqHdr
  212.  
  213.     DB    StkSiz DUP (?)        ; our stack, overflows into code
  214. MyStack    Label    Word
  215.  
  216. FuncTab    Label Word
  217.     DW    Offset PGROUP:Init
  218.     DW    Offset PGROUP:MediaChe
  219.     DW    Offset PGROUP:BuildBPB
  220.     DW    Offset PGROUP:IoCtlIn
  221.     DW    Offset PGROUP:Input
  222.     DW    Offset PGROUP:ndInput
  223.     DW    Offset PGROUP:InputSta
  224.     DW    Offset PGROUP:InputFlu
  225.     DW    Offset PGROUP:Output
  226.     DW    Offset PGROUP:OutVerif
  227.     DW    Offset PGROUP:OutStatu
  228.     DW    Offset PGROUP:OutFlush
  229.     DW    Offset PGROUP:IoCtlOut
  230.     DW    Offset PGROUP:DevOpen
  231.     DW    Offset PGROUP:DevClose
  232.     DW    Offset PGROUP:RemMedia
  233.  
  234. ReqHdr    DB    256 DUP (?)        ; copy of Request Header
  235.  
  236. DATA    EndS
  237.  
  238. DTAIL    Segment Public 'DATA'        ; for finding end of data segment
  239. DTAIL    EndS
  240.  
  241.     END    HDR            ; of HDR.ASM
  242.